From d3920dce139734e00bbe4447a16ef24dfe4d704a Mon Sep 17 00:00:00 2001
From: Eric Le Bihan <eric.le.bihan.dev@free.fr>
Date: Tue, 10 Oct 2017 19:51:02 +0200
Subject: [PATCH] No runtime tests for endianness

Replace build and execution of runtime test programs for determining
the endianness of the target with compile time test programs.

This improves support for cross-compilation.

Signed-off-by: Eric Le Bihan <eric.le.bihan.dev@free.fr>
---
 configure                     | 13 ++++++++++---
 src/sysdeps/trybigendian.c    | 16 ++++++++++++++++
 src/sysdeps/trylittleendian.c | 19 +++++++++++++++++++
 3 files changed, 45 insertions(+), 3 deletions(-)
 create mode 100644 src/sysdeps/trybigendian.c
 create mode 100644 src/sysdeps/trylittleendian.c

diff --git a/configure b/configure
index f34dcd0..f2a77f3 100755
--- a/configure
+++ b/configure
@@ -478,12 +478,19 @@ EOF
   exec 3>&-
 
   echo "Checking system endianness..."
-  $CC_AUTO $CPPFLAGS_AUTO $CPPFLAGS $CPPFLAGS_POST $CFLAGS_AUTO $CFLAGS $CFLAGS_POST $LDFLAGS_AUTO $LDFLAGS $LDFLAGS_POST -o tryendianness src/sysdeps/tryendianness.c
-  endianness=$(./tryendianness) || fail "$0: unable to determine endianness"
+  if $CC_AUTO $CPPFLAGS_AUTO $CPPFLAGS $CPPFLAGS_POST $CFLAGS_AUTO $CFLAGS $CFLAGS_POST $LDFLAGS_AUTO $LDFLAGS $LDFLAGS_POST -o trybigendian src/sysdeps/trybigendian.c 2>/dev/null; then
+      endianness=big
+  else
+      if $CC_AUTO $CPPFLAGS_AUTO $CPPFLAGS $CPPFLAGS_POST $CFLAGS_AUTO $CFLAGS $CFLAGS_POST $LDFLAGS_AUTO $LDFLAGS $LDFLAGS_POST -o trylittleendian src/sysdeps/trylittleendian.c 2>/dev/null; then
+          endianness=little
+      else
+          fail "$0: unable to determine endianness"
+      fi
+  fi
   echo "endianness: $endianness" >> $sysdeps/sysdeps
   echo "#define ${package_macro_name}_ENDIANNESS \"$endianness\"" >> $sysdeps/sysdeps.h
   echo "  ... $endianness"
-  rm -f tryendianness
+  rm -f trybigendian trylittleendian
 
   trytypes
   choose clr accept4 ACCEPT4 'accept4()'
diff --git a/src/sysdeps/trybigendian.c b/src/sysdeps/trybigendian.c
new file mode 100644
index 0000000..d857572
--- /dev/null
+++ b/src/sysdeps/trybigendian.c
@@ -0,0 +1,16 @@
+#if defined(__BYTE_ORDER) && (__BYTE_ORDER == __BIG_ENDIAN) ||	       \
+	defined(__BYTE_ORDER__) && (__BYTE_ORDER__  == __ORDER_BIG_ENDIAN__) || \
+	defined(__BIG_ENDIAN) ||				       \
+	defined(__ARMEB__) ||					       \
+	defined(__THUMBEB__) ||				       \
+	defined(__AARCH64EB__) ||				       \
+	defined(_MIPSEB) || defined(__MIPSEB) || defined(__MIPSEB__)
+#define YEAH
+#else
+#error "not big endian"
+#endif
+
+int main(void)
+{
+	return 0;
+}
diff --git a/src/sysdeps/trylittleendian.c b/src/sysdeps/trylittleendian.c
new file mode 100644
index 0000000..68b93c1
--- /dev/null
+++ b/src/sysdeps/trylittleendian.c
@@ -0,0 +1,19 @@
+#if defined(__BYTE_ORDER) && (__BYTE_ORDER == __LITTLE_ENDIAN) ||	\
+	defined(__BYTE_ORDER__) && (__BYTE_ORDER__  == __ORDER_LITTLE_ENDIAN__) || \
+	defined(__LITTLE_ENDIAN) ||					\
+	defined(__ARMEL__) ||						\
+	defined(__THUMBEL__) ||					\
+	defined(__AARCH64EL__) ||					\
+	defined(__i386) || defined(__i386__) ||			\
+	defined(__amd64) || defined(__amd64__) ||			\
+	defined(__x86_64) || defined(__x86_64__) ||			\
+	defined(_MIPSEL) || defined(__MIPSEL) || defined(__MIPSEL__)
+#define YEAH
+#else
+#error "not little endian"
+#endif
+
+int main(void)
+{
+	return 0;
+}
-- 
2.13.6

